package br.com.usapre.faces;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.business.BairroBusiness;
import br.com.business.CidadeBusiness;
import br.com.business.ListaComprasUsuarioBusiness;
import br.com.business.RamoAtividadeBusiness;
import br.com.business.UfBusiness;
import br.com.data.Bairro;
import br.com.data.Cidade;
import br.com.data.ListaComprasUsuario;
import br.com.data.RamoAtividade;
import br.com.data.Uf;
import br.com.databean.ComparacaoPrecos;
import br.com.login.faces.SessionUsaPreBean;
import br.com.utilidades.database.data.Criterio;
import br.com.utilidades.faces.SimpleMessageBean;
import constantes.CONSTANTES;

/**
 * @version 1.0.0
 * @since Fevereiro,28 2013
 * @author Eduardo Francisco Barbosa
 */
@Component
@Scope("session")
public class MinhaListaBean extends SimpleMessageBean implements Serializable {

    private static final long serialVersionUID = -6848143380420426489L;

    private RamoAtividadeBusiness ramoAtividadeBusinessImpl;
    private ListaComprasUsuarioBusiness listaCompraUsuarioBusinessImpl;

    private SessionUsaPreBean sessionUsaPreBean;

    private UfBusiness ufBusinessImpl;
    private CidadeBusiness cidadeBusinessImpl;
    private BairroBusiness bairroBusinessImpl;

    private List<Uf> ufs;
    private Uf uf;

    private List<Cidade> cidades;
    private Cidade cidade;

    private List<Bairro> bairros;
    private Bairro bairro;

    private List<RamoAtividade> ramoAtividadeList;
    private RamoAtividade ramoAtividadeEscolhido;

    private List<ListaComprasUsuario> listaCompras;

    private Integer quantidadeProdutos;

    private List<ComparacaoPrecos> comparacaoPrecos;
    private ComparacaoPrecos comparacaoPreco;

    private Boolean comparacaoLiberada;

    /**
     * construtor
     */
    @Autowired
    public MinhaListaBean(RamoAtividadeBusiness ramoAtividadeBusinessImpl,
	    ListaComprasUsuarioBusiness listaCompraUsuarioBusinessImpl, UfBusiness ufBusinessImpl,
	    CidadeBusiness cidadeBusinessImpl, BairroBusiness bairroBusinessImpl,

	    SessionUsaPreBean sessionUsaPreBean) {

	this.ramoAtividadeBusinessImpl = ramoAtividadeBusinessImpl;
	this.listaCompraUsuarioBusinessImpl = listaCompraUsuarioBusinessImpl;

	this.ufBusinessImpl = ufBusinessImpl;
	this.cidadeBusinessImpl = cidadeBusinessImpl;
	this.bairroBusinessImpl = bairroBusinessImpl;

	this.sessionUsaPreBean = sessionUsaPreBean;

	reset();
    }

    /**
     * reset
     */
    public void reset() {

	ramoAtividadeList = ramoAtividadeBusinessImpl.buscarPorNomeBusca("");
	ramoAtividadeEscolhido = null;

	listaCompras = new ArrayList<ListaComprasUsuario>();

	cidades = new ArrayList<Cidade>();

	ufs = ufBusinessImpl.buscarPorNomeBusca("");

	for (Uf uft : ufs) {
	    if (uft.getId().equals(CONSTANTES.COD_ESTADO_PADRAO)) {
		uf = uft;
	    }
	}

	atualizaCidade();

	for (Cidade cidadet : cidades) {
	    if (cidadet.getId().equals(CONSTANTES.COD_CIDADE_PADRAO)) {
		cidade = cidadet;
	    }
	}

	atualizaBairro();

	quantidadeProdutos = 0;

	comparacaoLiberada = Boolean.FALSE;

    }

    /**
     * atualizaCidade
     */
    public void atualizaCidade() {

	if (uf == null) {

	} else {

	    cidades = new ArrayList<Cidade>();

	    List<Criterio> criterios = new ArrayList<Criterio>();
	    Criterio crit = new Criterio();
	    crit.setCampo("uf.id");
	    crit.setComparacao(" = ");
	    crit.setValue(uf.getId());
	    crit.setTipo(Criterio.TIPO_INTEGER);
	    criterios.add(crit);

	    cidades = cidadeBusinessImpl.buscarPorCriterios(criterios, " nome ");

	}

    }

    /**
     * atualizaBairro
     */
    public void atualizaBairro() {

	if (cidade == null) {

	} else {

	    bairros = new ArrayList<Bairro>();

	    List<Criterio> criterios = new ArrayList<Criterio>();
	    Criterio crit = new Criterio();
	    crit.setCampo("cidade.id");
	    crit.setComparacao(" = ");
	    crit.setValue(cidade.getId());
	    crit.setTipo(Criterio.TIPO_INTEGER);
	    criterios.add(crit);

	    bairros = bairroBusinessImpl.buscarPorCriterios(criterios, " nome ");
	}

    }

    /**
     * buscarMinhaLista
     */
    public void buscarMinhaLista() {

	if (ramoAtividadeEscolhido == null) {
	    String msg = super.getMensagem("MN_definir_ramo_atividade_valido");
	    enviaMensagem(msg, msg);
	} else {

	    listaCompras = listaCompraUsuarioBusinessImpl.buscarListaCompraUsuarioPorUsuario(
		    sessionUsaPreBean.getUsuario(), ramoAtividadeEscolhido);

	    quantidadeProdutos = listaCompras.size();

	}

	if (quantidadeProdutos > 0) {
	    comparacaoLiberada = Boolean.TRUE;
	} else {
	    comparacaoLiberada = Boolean.FALSE;
	}

    }

    /**
     * limparLista
     * 
     * metodo responsavel por limpar a lista de compras do usuario, setando
     * todas quantidades em 0
     */
    public void limparLista() {
	for (ListaComprasUsuario lc : listaCompras) {
	    lc.setQtdade(0d);
	}
	salvarLista();
    }

    /**
     * salvarLista
     */
    public void salvarLista() {
	for (ListaComprasUsuario lc : listaCompras) {
	    if (lc.getQtdade() == null || lc.getQtdade() == 0d) {

		lc.setDataCadastro(new Date());

		if (lc.getId() == null || lc.getId() == 0) {
		    // nao faz nada
		} else {
		    if (lc.getQtdade().equals(lc.getValorAnterior())) {

		    } else {
			listaCompraUsuarioBusinessImpl.atualizar(lc);
		    }
		}

	    } else {

		lc.setDataCadastro(new Date());

		if (lc.getId() == null || lc.getId() == 0) {
		    listaCompraUsuarioBusinessImpl.salvar(lc);
		} else {
		    if (lc.getQtdade().equals(lc.getValorAnterior())) {

		    } else {
			listaCompraUsuarioBusinessImpl.atualizar(lc);
		    }
		}

	    }
	}

	String msg = super.getMensagem("MN_quantidade_salva_sucesso");
	enviaMensagem(msg, msg);

	buscarMinhaLista();
    }

    /**
     * comparar
     */
    public void comparar() {

	if (comparacaoLiberada) {

	    if (uf == null || uf.getId() == null || uf.getId() == 0) {
		String msg = super.getMensagem("MN_definir_um_estado");
		enviaMensagem(msg, msg);
	    } else {

		try {
		    FacesContext.getCurrentInstance().getExternalContext()
			    .redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoMinhaListaCompare.jsf");
		} catch (Exception ex) {
		    ex.printStackTrace();
		}

		List<ListaComprasUsuario> listaComparar = new ArrayList<ListaComprasUsuario>();
		for (ListaComprasUsuario lst : listaCompras) {
		    if (lst.getQtdade() > 0) {
			listaComparar.add(lst);
		    }
		}

		if (listaComparar.size() > 0) {
		    comparacaoPrecos = listaCompraUsuarioBusinessImpl.compararPrecos(listaComparar, uf, cidade, bairro);

		    comparacaoPreco = comparacaoPrecos.get(0);

		} else {

		    String msg = super.getMensagem("MN_comparacao_nao_feita_produto_quantidade_invalida");
		    enviaMensagem(msg, msg);

		}

	    }

	} else {

	    String msg = super.getMensagem("MN_comparacao_nao_feita");
	    enviaMensagem(msg, msg);

	}

    }

    /**
     * voltar
     */
    public void voltar() {

	buscarMinhaLista();

	try {
	    FacesContext.getCurrentInstance().getExternalContext()
		    .redirect("/" + CONSTANTES.URLUSAPRE + "/gerenciamentoMinhaLista.jsf");
	} catch (Exception ex) {
	    ex.printStackTrace();
	}

    }

    // SETS AND GETS
    public List<RamoAtividade> getRamoAtividadeList() {
	return ramoAtividadeList;
    }

    public void setRamoAtividadeList(List<RamoAtividade> ramoAtividadeList) {
	this.ramoAtividadeList = ramoAtividadeList;
    }

    public RamoAtividade getRamoAtividadeEscolhido() {
	return ramoAtividadeEscolhido;
    }

    public void setRamoAtividadeEscolhido(RamoAtividade ramoAtividadeEscolhido) {
	this.ramoAtividadeEscolhido = ramoAtividadeEscolhido;
    }

    public List<ListaComprasUsuario> getListaCompras() {
	return listaCompras;
    }

    public void setListaCompras(List<ListaComprasUsuario> listaCompras) {
	this.listaCompras = listaCompras;
    }

    public Integer getQuantidadeProdutos() {
	return quantidadeProdutos;
    }

    public void setQuantidadeProdutos(Integer quantidadeProdutos) {
	this.quantidadeProdutos = quantidadeProdutos;
    }

    public List<ComparacaoPrecos> getComparacaoPrecos() {
	return comparacaoPrecos;
    }

    public void setComparacaoPrecos(List<ComparacaoPrecos> comparacaoPrecos) {
	this.comparacaoPrecos = comparacaoPrecos;
    }

    public ComparacaoPrecos getComparacaoPreco() {
	return comparacaoPreco;
    }

    public void setComparacaoPreco(ComparacaoPrecos comparacaoPreco) {
	this.comparacaoPreco = comparacaoPreco;
    }

    public List<Uf> getUfs() {
	return ufs;
    }

    public void setUfs(List<Uf> ufs) {
	this.ufs = ufs;
    }

    public Uf getUf() {
	return uf;
    }

    public void setUf(Uf uf) {
	this.uf = uf;
    }

    public List<Cidade> getCidades() {
	return cidades;
    }

    public void setCidades(List<Cidade> cidades) {
	this.cidades = cidades;
    }

    public Cidade getCidade() {
	return cidade;
    }

    public void setCidade(Cidade cidade) {
	this.cidade = cidade;
    }

    public List<Bairro> getBairros() {
	return bairros;
    }

    public void setBairros(List<Bairro> bairros) {
	this.bairros = bairros;
    }

    public Bairro getBairro() {
	return bairro;
    }

    public void setBairro(Bairro bairro) {
	this.bairro = bairro;
    }

}